#include "Formes/Ellipsoide.hpp"
#include "Environnement.hpp"
#include "Materiaux/AplatCouleur.hpp"
#include "Rayon.hpp"
#include "Algebre/Coord.hpp"
#include "Lumieres/Source.hpp"

#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
  Coord p(0., 0., 0.);
  VecteurU v(0., 0., 1.);
  double r(1.), h(2.);

  Ellipsoide f( p, VecteurU( 1., 0., 0. ),
		   VecteurU( 0., 1., 0. ), 1., 4., 2. );

  AplatCouleur * mat = new AplatCouleur( 0.2, 0., 1., 0.6, 0.,
					 Couleur( 255u, 0u, 0u ) );

  Environnement env( Couleur( 255u, 255u, 255u ) );

  Objet * obj = new Objet( mat, &f );

  Source * src = new Source( Couleur( 255u, 255u, 255u ),
			     Coord( 0., 50., 0. ) );

  env.ajouterObjet( obj );
  env.ajouterLumiere( src );

  Coord A(5., 0., 0.);

  Rayon ray( A, VecteurU( -1., 0., 0. ) );

  Coord inter( f.trouveIntersection( ray ) );


  cout << "Intersection : " << inter << ", normale : " << f.normale( inter )
       << endl;
  cout << "Couleur : " << env.lanceRayon( ray, 2, 1., true ) << endl;
  cout << "*****************************************************************************" << endl;

  Coord B(5., -3.6, 0.1);

  ray = Rayon( B, VecteurU( -1., 0., 0. ) );

  inter = f.trouveIntersection( ray );

  cout << "Intersection : " << inter << ", normale : " << f.normale( inter )
       << endl;
  cout << "Couleur : " << env.lanceRayon( ray, 2, 1., true ) << endl;
  cout << "*****************************************************************************" << endl;

  Coord C(5., 3.6, -0.1);

  ray = Rayon( C, VecteurU( -1., 0., 0. ) );

  inter = f.trouveIntersection( ray );

  cout << "Intersection : " << inter << ", normale : " << f.normale( inter )
       << endl;
  cout << "Couleur : " << env.lanceRayon( ray, 2, 1., true ) << endl;

  delete obj;
  obj = 0;

  delete src;
  src = 0;

  delete mat;
  mat = 0;

  return 0;
}
